package cn.dengta.webapp.trade.service;

import java.util.List;
import javax.annotation.Nonnull;

import cn.dengta.webapp.base.dao.BaseDao;
import cn.dengta.webapp.base.entity.BaseEntity;
import cn.dengta.webapp.base.service.BaseServiceImpl;
import cn.dengta.webapp.trade.entity.UserCoin;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

/**
 * 用户关联的交易账户 Service 基类
 */
public abstract class AbstractTradeAccountService<T extends BaseEntity, D extends BaseDao<T>> extends BaseServiceImpl<T, D, Long> {

	@Override
	public T getByUserId(@Nonnull Long userId) {
		return getByUserId(userId, false);
	}

	protected abstract T initAccount(@Nonnull Long userId);

	public T getByUserIdForUpdate(@Nonnull Long userId) {
		return getByUserId(userId, true);
	}

	private T getByUserId(@Nonnull Long userId, boolean forUpdate) {
		T t = forUpdate ? getByIdForUpdate(userId) : get(userId);
		if (t == null) {
			// TODO 可能存在并发插入冲突
			t = initAccount(userId);
			t.setId(userId);
			save(t);
		}
		return t;
	}

	/**
	 * 根据用户ID查询账户
	 */
	public List<T> findByUserIds(@Nonnull Long... userId) {
		return selectList(new QueryWrapper<T>().in(UserCoin.USER_ID, (Object[]) userId));
	}

	/**
	 * 根据用户ID查询账户
	 */
	public List<T> findByUserIds(@Nonnull List<Long> userId) {
		return selectList(new QueryWrapper<T>().in(UserCoin.USER_ID, userId));
	}

}
